AWS Lambda(Python3)でEC2インスタンス一覧を取得する
おはようございます。AWS事業部 加藤です。
せっかくAWSを使うならLambdaを使いたい!そんな訳でPython3でLambdaを触ってみます。
目的
- EC2インスタンスIDの一覧を取得する
- 実行時にリージョンを指定する
やってみた
IAMロール作成
Lambda実行用のIAMロールを作成します。
項目 | 値 |
---|---|
使用するサービス | Lambda |
アタッチするポリシー | AmazonEC2ReadOnlyAccess |
ロール名 | LambdaRoleEC2ReadOnly |
マネジメントコンソールでIAMの画面を開きロール作成を押します。
Lambdaが使用するロールなので、使用するサービスはLambdaを選択します。
EC2の読み取り権限があれば十分なので、「AmazonEC2ReadOnlyAccess」をアタッチします。
ロール名を「LambdaRoleEC2ReadOnly」にしました。既存の他ロールとフォーマットを揃えたいなど理由ある場合は任意の名称でOKです。
Lambdaファンクション作成
Hello World
ファンクションを作成します。
項目 | 値 |
---|---|
作成方法 | 一から作成 |
ランタイム | Python3.6 |
ロール | 既存のロールを選択 |
既存のロール | LambdaRoleEC2ReadOnly |
マネジメントコンソールでLambdaの画面を開きます。キャプチャはウェルカムページ(Lambda初回使用時)の場合です。
関数の作成をクリックします。
サンプルは使わずに作成したいので、「一から作成」を選択します。
各項目を上記の表にしたがって入力・選択し「関数の作成」をクリックします。
Python3で「一から作成」を選択した場合は、以下のようなHelloWorldのコードが作成されました。
関数「lambda_handler」が2つの引数event, context を持っていて、返り値は「Hello from Lambda」という文字列ですね。
早速実行してみます、テストというボタンがあるのでクリックします。
「テストイベントの設定」という画面が開きました。
とりあえずイベント名を「MyHelloWorld」と設定して、そのまま作成します。
元の画面に戻りました。コンボボックスで作成したテストイベントが選択されています。
「テスト」をクリックします。
実行結果を展開すると、「Hello from Lambda」と表示されました。
リージョンの受け取り
作ろうとしているファンクションは実行時にリージョンを指定し、リージョン内のインスタンスID一覧を出力します。
まずは、テストデータでリージョンを受け取りコンソール出力してみましょう。
「テストイベントの設定」画面へ移行します。
「RegionTokyo」というイベントを作成します。
{ "Region": "ap-northeast-1" }
コードを書き換えます。
def lambda_handler(event, context): return event['Region']
受け取ったデータはeventにdict型で格納されています。キー: Regionを取り出したいので event['Region'] と記述します。
保存して、テストしてみます。
リージョンを受け取ることができました。
インスタンスID出力
EC2の情報を受け取れるようにコードを書き換えて実行します。
import boto3; def lambda_handler(event, context): client = boto3.client('ec2', event['Region']) responce = client.describe_instances() print (responce) return event['Region']
出力が長く表示しきれませんでしたが、インスタンスの情報が出力されています。
responce
がdict型なので、return responce
とせず、print
で表示しました。
インスタンスIDのみ取得するために、更にコードを書き換えます。
import boto3; def lambda_handler(event, context): client = boto3.client('ec2', event['Region']) responce = client.describe_instances() all_list = [] for reservation in responce['Reservations']: for instance in reservation['Instances']: all_list.append(instance['InstanceId']) return all_list
実行します。
インスタンスID一覧を取得できました!
あとがき
後半かなりとばしてしまいましたが、無事に動いたでしょうか? このままでは、Lambdaを使っている意味が無いので、さらに書き換えて使えるようにしていきます。 最終的には、任意のタグをデータとして受け取ってインスタンス情報を出力させたいです。